{"componentChunkName":"component---src-templates-category-js","path":"/code","result":{"pageContext":{"category":"code","edges":[{"node":{"id":"2cad6462-deb5-57d8-801d-4fc60889647d","body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"date\": \"2021-02-08\",\n  \"title\": \"No More Initiative\",\n  \"category\": \"games\",\n  \"image\": \"../images/noinit-tracker.png\",\n  \"short\": \"No More Initiative is an extension for Fantasy Grounds that speeds up combat.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"No More Initiative\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"498px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/01c9b5dae43ad2ee4789735da96f73ad/79e1b/noinit-tracker.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"100%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVQ4y01UWVOcVRCdP+STLz5YPufZUqsMoaImlGEdmAkDM8wIEohRy5CAhSwawZCwwwzMvu8bszBbJpQ++E+OffqbiXnouvd+fft09+lzP9PwwC04zYOYmxiEQ8xp+Qou69eYm7wL+9ht2EdvwzE+AMfYgJz/Nz2Lj3dmR77EY/sDTHzzBUzT43dhvv8ZVp7Ysbpgwc+2YfxoGcKKaxJbq0vY/nUZW2tL2Hy+iM3VR++MPvWvLWP96QKe/eTE0OCnMO1sP4fvfA+lXAT1TAiJox3E918g4zlAu55F+zqHZi2DRiVlWJWWRkt8nUZe/FnkUgGEg264bOMw7QpgIRPE4attRIKnaF5LsFxqSsC1AFxfJVEtRnGVD+taLcUUlDF7O+s4O95FPHAs9+JwTgvgn5srKOcjiAROkYx6kE1cIp/yoygBV/moVB6WCnzIp/36vZQNCVhA/fHwOZIRN9KxCzSl6vnZSZhebDxVp8+zrxa4PETIdyz7A0lwgVjwDLHQORIRD7zu11rh+5XWy3E9t+oZzEw+gGlj9YlUEULQe4SoBDMrjfts0oeMVBwJnEiFwpMkYvJmD6hSiBjgxRjeNAuYnRrpcSiX/Z7XGhgVHmmBywOkpBWCRoWOTMKrtBCQ1V0JTWWhw+A2hrftIhbsUzLlrRWkhLszma7XbbTsPnmpQEzgOX2pK9sNio+AXM9lGBdne0pJrRTHG5m43TJsDIWku092kRMQttMSmagsRDIqG/nWrKVlkgmdZqOS0H2jklRp1aRiymfu4ShMf/z2i/Lhdb8SHg+1Gg6hkOYUPToM8kmtpWRI9PsvDmRwRzq0SIA+v7bssk0Ywq4IsWy1D8iLlAzB4iFjSAzKJnyydyPiN7hOyD4s+2I2iJtOydDh0d62aoschWTSfpEOK8lLhRwCAVgxh0IAVsfkupe7rLRSiKLbKgqHI0aF3VZB2yYvFGjflEsx8kRO+fSUY+6rxitiDKXTFh3azN8asuk0sqopklsvJ/QiJ8c9L/PM99v3MZkBZhil05Ynqxz+9fua9l/pB/L9itUlM42a48oElYLxno3E8XeJeKfTyGF6Ysio8KZT1gBe6AOpLN6rSvf0CRABa71E9LM7Ssw6eh+m/d0NeTZ5VX2t9077T6r/h6kpiEEB175pMumG3RFD3/L6sx/w7z8NLbkr77FznVWR8qzfZGA37ZIG0Lq9lTT93a1qd/xWly7u3fkcpluffITvZsxYnp/BI6dVteSwjso6Jsofw6J8m581Y3HOKmZR+94xhSXXQzyWGGO1YfjeHXz84Qf4D01AzQeQ/bDVAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Screenshot of extension in use\",\n    \"title\": \"Screenshot of extension in use\",\n    \"src\": \"/static/01c9b5dae43ad2ee4789735da96f73ad/79e1b/noinit-tracker.png\",\n    \"srcSet\": [\"/static/01c9b5dae43ad2ee4789735da96f73ad/5a46d/noinit-tracker.png 300w\", \"/static/01c9b5dae43ad2ee4789735da96f73ad/79e1b/noinit-tracker.png 498w\"],\n    \"sizes\": \"(max-width: 498px) 100vw, 498px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"Dungeons and Dragons uses a system called initiative to determine turn order. Players roll dice at the\\nstart of combat to determine the turn order, after which it is fixed. This extension lets you run\\nFantasy Grounds and Fantasy Grounds Unity games with \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"em\", {\n    parentName: \"strong\"\n  }, \"no initiative\")), \".\"), mdx(\"p\", null, mdx(\"center\", null, mdx(\"a\", {\n    className: \"button is-primary\",\n    href: \"/5e_No_Initiative.ext\",\n    target: \"_blank\"\n  }, \"Download (22kb)\"))), mdx(\"p\", null, \"The extension creates a note that the DM can optionally share by\\nchecking the \\\"Public\\\" option. When die rolls are made, they are added to the list, which is kept\\nsorted. It also displays whether the roll was sucessful or not.\"), mdx(\"p\", null, \"Place it in your FG or FGU \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"data/extensions\"), \" folder.\"), mdx(\"h1\", null, \"How do you use it?\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The DM announces a new round.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Players roll their attacks whenever they are ready \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"but do not roll damage\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"DM announces that the attack phase is complete and moves on to the resolution phase\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"DM reads down the list in the tracker, narrating what happens highest die roll to lowest\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"As the DM reads down the list, they ask the player in question to roll damage\")), mdx(\"p\", null, \"That's it! *\"), mdx(\"p\", null, mdx(\"small\", null, \"* \", mdx(\"i\", null, \"there is one issue, which is that you still need to forward through the turns to trigger any \\\"at the start of your turn\\\" type events.\"))), mdx(\"h1\", null, \"Wait... what?\"), mdx(\"p\", null, \"No initiative? What? Are you crazy?\"), mdx(\"p\", null, \"No initiative might sound crazy, but my players seem to prefer it. Try it out, you might like it.\\nThe idea is that when you roll dice it actually includes an intrinsic sense of initiave. I originally came across this idea\\nfrom \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.youtube.com/watch?v=y_mxYKzEjms\"\n  }), \"this video\"), \":\"), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.youtube.com/watch?v=y_mxYKzEjms\"\n  }), mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"720px\"\n    }\n  }), \"\\n      \", mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"55.99999999999999%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/webp;base64,UklGRpAAAABXRUJQVlA4IIQAAADQAwCdASoUAAsAPtFUo0uoJKMhsAgBABoJZgCdABoNWgbVAiMZ4IAA8ka56vPekt10zopZm2HUHHuDnH8tyCdvQuF/A2Xj+qx9k5+F9nDo9B+xXMkWMeYjOMHIr/etbh7medc8rwvapd2FR9QHAjk2EmNvFLD4J01iQoFqAnLH4EMuAAA=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"YouTube thumbnail\",\n    \"title\": \"YouTube thumbnail\",\n    \"src\": \"/static/5a4805f6a19266472d356b763159d4e9/bc514/noinit-youtube-thumbnail.webp\",\n    \"srcSet\": [\"/static/5a4805f6a19266472d356b763159d4e9/c85cb/noinit-youtube-thumbnail.webp 300w\", \"/static/5a4805f6a19266472d356b763159d4e9/e88ff/noinit-youtube-thumbnail.webp 600w\", \"/static/5a4805f6a19266472d356b763159d4e9/bc514/noinit-youtube-thumbnail.webp 720w\"],\n    \"sizes\": \"(max-width: 720px) 100vw, 720px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n    \"))), mdx(\"h1\", null, \"More details on No Initiative\"), mdx(\"p\", null, \"There are several edge cases that can arise from a no initiative system. You can solve them\\nhowever you want, but here are some ways that I deal with them:\"), mdx(\"h2\", null, \"Movement\"), mdx(\"p\", null, \"I allow players to move before they do their action if they want. If a player specifically wants\\nto move after they've done something then they just tell me. Unless there is a good reason not to\\nallow it, I allow it. If there is ever any doubt, I ask them to do a contest check, such as an\\nathletics contest against an enemy that's trying to cut them off. You can also just have them\\nthrow a d20 to see if they can get there in time.\"), mdx(\"h2\", null, \"Opportunity attacks\"), mdx(\"p\", null, \"If a player runs up to an opponent and the opponent runs away at the same time, no opportunity\\nattack is triggered. If they start the round next to each other, then it is triggered. It should\\nbe intuitive when an opportunity attack is appropriate, but if you're running into issues, you\\ncan separate the movement and actions into separate phases. Movement first, actions second.\"), mdx(\"h2\", null, \"Fallen Targets\"), mdx(\"p\", null, \"If a player's target is taken down before it gets to their action, I allow them to instead strike\\na similar target. For melee, it needs to be adjacent to them. For ranged it needs to be in the\\nsame general vicinity.\"), mdx(\"p\", null, \"If you don't like that, another option is to allow them to roll at disadvantage for a replacement\\naction. The disadvantage represents that they were intending to do something and had to hastily\\nswitch.\"), mdx(\"h1\", null, \"Why would you do this?\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"It makes combat fast and furious\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Combat actually becomes more intense and interesting\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"You can get through more play in less time\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Players aren't bored waiting for their turn\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Best of all, narrating the scene is better because it all connects\")), mdx(\"p\", null, \"This extension makes it easy to do. At first I was trying to read back through the log and I don't\\nrecommend that, too easy to miss actions or get the order wrong.\"), mdx(\"h1\", null, \"Technical notes\"), mdx(\"p\", null, \"The extension passes die rolls to the host through out of bounds (OOB) messages.\\nThe host then parses them into:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"nValue\"), \": the roll total\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"nHit\"), \": whether it hit or missed\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"sSource\"), \": the legible name of the actor doing the action\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"sTarget\"), \": the legible name of the actor being targeted\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"sActivity\"), \": the legible name of the weapon or spell\")), mdx(\"p\", null, \"The host then adds those values to a table, which is sorted by \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"nValue\"), \". It uses this table\\nto generate the tracker note with formatting, such as bold and italics.\"), mdx(\"p\", null, \"Spells are interesting because they are done as forced saving throws. In Fantasy Grounds this\\nis achieved using two different actions: first a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"\\\"powersave\\\"\"), \" action, which then forces the target to\\ntake a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"\\\"save\\\"\"), \" action. We need both of these to figure out a spell.\"), mdx(\"p\", null, \"The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"\\\"powersave\\\"\"), \" action doesn't have the roll but gives us the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sSource\"), \" field, while the\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"save\"), \" action tells us the roll but doesn't have the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sSource\"), \" information any more.\"), mdx(\"p\", null, \"Another thing about saves is that they are defensive. Therefore we calculate a proxy value\\nby taking the DC, and adding the DC minus the roll. This anchors the value to the DC number\\nwhile making a target that rolls low take damage earlier.\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"nValue = DC + DC - roll\")), mdx(\"p\", null, \"For example, someone that rolls a 2 on a DC 14 has the hit against them recorded as 26:\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"26 = 14 + 14 - 2\")), mdx(\"h2\", null, \"Hooks in Fantasy Grounds (and Fantasy Grounds Unity)\"), mdx(\"p\", null, \"I wasn't able to find an appropriate event listener. There is \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"registerResultHandler\"), \",\\nwhich tells us about the roll that was made. However, we're missing the source and target\\ninformation.\"), mdx(\"p\", null, \"Instead, we intercept the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ActionsManager.resolveAction\"), \" function from the CORE ruleset. This\\nis very easy in lua:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-lua\"\n  }), \"function onInit()\\n    orig_resolveAction = ActionsManager.resolveAction\\n    ActionsManager.resolveAction = my_resolveAction\\nend\\n\\nfunction my_resolveAction(rSource, rTarget, rRoll)\\n    ... -- do our logic here, with access to rSource, rTarget, rRoll\\n    orig_resolveAction(rSource, rTarget, rRoll);\\nend\\n\")), mdx(\"h2\", null, \"5E versus CORE\"), mdx(\"p\", null, \"While I wanted this extension to be widely useful, I happen to use it for D&D 5E. I tried\\nto make the 5E ruleset optional, but I haven't tested with an actual non-5E game.\"), mdx(\"p\", null, \"In 5E there is advantage and disadvantage. This means you roll two dice and take either\\nthe higher or lower of the two. CORE doesn't understand this, so I had to add extra logic\\nto decode the dice result, adapted from the 5E ruleset code:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-lua\"\n  }), \"function getRollTotal(rRoll)\\n    local bADV = string.match(rRoll.sDesc, \\\"%[ADV%]\\\");\\n    local bDIS = string.match(rRoll.sDesc, \\\"%[DIS%]\\\");\\n    if (bADV and not bDIS) or (bDIS and not bADV) then\\n        if #(rRoll.aDice) > 1 then\\n            local nDecodeDie;\\n            if (bADV and not bDIS) then\\n                nDecodeDie = math.max(rRoll.aDice[1].result, rRoll.aDice[2].result);\\n            else\\n                nDecodeDie = math.min(rRoll.aDice[1].result, rRoll.aDice[2].result);\\n            end\\n            return nDecodeDie + rRoll.nMod;\\n        end\\n    end\\n    return ActionsManager.total(rRoll);\\nend\\n\")), mdx(\"p\", null, \"Spell casting in 5E is done in reverse. Rather than rolling to see how your spell\\ndid, the opponent rolls to see if they saved. To figure out if the spell hit, we need\\nto figure out if they made their roll or not, and reverse it.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-lua\"\n  }), \"function getSaveDetermination(nValue, rRoll)\\n    if getRollTotal(rRoll) >= rRoll.nTarget then\\n        -- actor made their saving throw, therefore action missed\\n        return HIT_MISS;\\n    else\\n        return HIT_HIT;\\n    end\\nend\\n\")), mdx(\"h2\", null, \"possible future enhancements\"), mdx(\"p\", null, \"The biggest enhancement I would make would be to handle the \\\"on your next turn\\\" type\\nevents automatically. For example, regeneration is only applied when the\\nactor's turn starts.\"), mdx(\"p\", null, \"Other ideas:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"User options to control how the tracker is formatted\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Support for other rulesets\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"5E: highlight crit and fumble rolls, for extra narrative flavor\")), mdx(\"h1\", null, \"My overall thoughts on FGU and lua\"), mdx(\"p\", null, \"Lua is a beautifully simple and clean language. It's amazing that SmiteWorks made\\nso much, both CORE and 5E rulesets, entirely with Lua. Fantasy Grounds is a cool system with\\nthe database and OOB delivery systems being straight forward and easy to work with.\"), mdx(\"p\", null, \"Documentation would be nice. Also it would be nice if they ruleset was designed to\\nbe more reusable. For example, getting the AC or DC would be nice. A logical flow\\nof action processing would be nice, rather than \\\"powersave\\\" hack for example.\"));\n}\n;\nMDXContent.isMDXComponent = true;","fileAbsolutePath":"C:/Users/alex/Documents/gatsby/g-talistreit-com/src/posts/2021-02-08-no-initiative.mdx","excerpt":"No More Initiative Dungeons and Dragons uses a system called initiative to determine turn order. Players roll dice at the\nstart of combat to…","frontmatter":{"date":"February 08, 2021","title":"No More Initiative","category":"games","short":"No More Initiative is an extension for Fantasy Grounds that speeds up combat.","image":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1UlEQVQ4y01UWVOcVRCdP+STLz5YPufZUqsMoaImlGEdmAkDM8wIEohRy5CAhSwawZCwwwzMvu8bszBbJpQ++E+OffqbiXnouvd+fft09+lzP9PwwC04zYOYmxiEQ8xp+Qou69eYm7wL+9ht2EdvwzE+AMfYgJz/Nz2Lj3dmR77EY/sDTHzzBUzT43dhvv8ZVp7Ysbpgwc+2YfxoGcKKaxJbq0vY/nUZW2tL2Hy+iM3VR++MPvWvLWP96QKe/eTE0OCnMO1sP4fvfA+lXAT1TAiJox3E918g4zlAu55F+zqHZi2DRiVlWJWWRkt8nUZe/FnkUgGEg264bOMw7QpgIRPE4attRIKnaF5LsFxqSsC1AFxfJVEtRnGVD+taLcUUlDF7O+s4O95FPHAs9+JwTgvgn5srKOcjiAROkYx6kE1cIp/yoygBV/moVB6WCnzIp/36vZQNCVhA/fHwOZIRN9KxCzSl6vnZSZhebDxVp8+zrxa4PETIdyz7A0lwgVjwDLHQORIRD7zu11rh+5XWy3E9t+oZzEw+gGlj9YlUEULQe4SoBDMrjfts0oeMVBwJnEiFwpMkYvJmD6hSiBjgxRjeNAuYnRrpcSiX/Z7XGhgVHmmBywOkpBWCRoWOTMKrtBCQ1V0JTWWhw+A2hrftIhbsUzLlrRWkhLszma7XbbTsPnmpQEzgOX2pK9sNio+AXM9lGBdne0pJrRTHG5m43TJsDIWku092kRMQttMSmagsRDIqG/nWrKVlkgmdZqOS0H2jklRp1aRiymfu4ShMf/z2i/Lhdb8SHg+1Gg6hkOYUPToM8kmtpWRI9PsvDmRwRzq0SIA+v7bssk0Ywq4IsWy1D8iLlAzB4iFjSAzKJnyydyPiN7hOyD4s+2I2iJtOydDh0d62aoschWTSfpEOK8lLhRwCAVgxh0IAVsfkupe7rLRSiKLbKgqHI0aF3VZB2yYvFGjflEsx8kRO+fSUY+6rxitiDKXTFh3azN8asuk0sqopklsvJ/QiJ8c9L/PM99v3MZkBZhil05Ynqxz+9fua9l/pB/L9itUlM42a48oElYLxno3E8XeJeKfTyGF6Ysio8KZT1gBe6AOpLN6rSvf0CRABa71E9LM7Ssw6eh+m/d0NeTZ5VX2t9077T6r/h6kpiEEB175pMumG3RFD3/L6sx/w7z8NLbkr77FznVWR8qzfZGA37ZIG0Lq9lTT93a1qd/xWly7u3fkcpluffITvZsxYnp/BI6dVteSwjso6Jsofw6J8m581Y3HOKmZR+94xhSXXQzyWGGO1YfjeHXz84Qf4D01AzQeQ/bDVAAAAAElFTkSuQmCC","width":96,"height":96,"src":"/static/01c9b5dae43ad2ee4789735da96f73ad/88b72/noinit-tracker.png","srcSet":"/static/01c9b5dae43ad2ee4789735da96f73ad/88b72/noinit-tracker.png 1x,\n/static/01c9b5dae43ad2ee4789735da96f73ad/a12fc/noinit-tracker.png 1.5x,\n/static/01c9b5dae43ad2ee4789735da96f73ad/f20a7/noinit-tracker.png 2x"}}}},"slug":"2021-02-08-no-initiative"}},{"node":{"id":"16da1fa2-9cfd-520d-9076-359b98f7b2f2","body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"date\": \"2021-01-27\",\n  \"title\": \"Building this website\",\n  \"category\": \"code\",\n  \"image\": \"../images/new-site-code.jpeg\",\n  \"short\": \"This website was built using gatsby, mdx, and bulma. This is a discussion on why.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"Building This website\"), mdx(\"p\", null, \"Back in 2005 I hand crafted HTML pages and a CSS stylesheet. It worked and the site was\\nfast to deliver but not necessarily the easiest to update. I wasn't very satisfied\\nwith content management systems, because the site rarely changed and the slow down for\\nvisitors seemed like a trade off that wasn't worth taking.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/1f51275a2e7d1a648b4f30a4d852ea16/34e07/old-site-ss.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"81%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMCBAX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHTGzFFkP/EABkQAAIDAQAAAAAAAAAAAAAAAAADAQITMv/aAAgBAQABBQLBZgowUMm0FeT/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAbEAACAgMBAAAAAAAAAAAAAAAAAQIzEBESMf/aAAgBAQAGPwKuJXEriLlC37j/xAAdEAACAgEFAAAAAAAAAAAAAAABEQAhEFFhkeHx/9oACAEBAAE/IdfgnlwdZDll7NRycUljH//aAAwDAQACAAMAAAAQUM//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhMWGB/9oACAEBAAE/EFw2ewTKjfnIehtaOzK5DedLyprYAGE//9k=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Screenshot of the home page\",\n    \"title\": \"Screenshot of the home page\",\n    \"src\": \"/static/1f51275a2e7d1a648b4f30a4d852ea16/e5166/old-site-ss.jpg\",\n    \"srcSet\": [\"/static/1f51275a2e7d1a648b4f30a4d852ea16/f93b5/old-site-ss.jpg 300w\", \"/static/1f51275a2e7d1a648b4f30a4d852ea16/b4294/old-site-ss.jpg 600w\", \"/static/1f51275a2e7d1a648b4f30a4d852ea16/e5166/old-site-ss.jpg 1200w\", \"/static/1f51275a2e7d1a648b4f30a4d852ea16/d9c39/old-site-ss.jpg 1800w\", \"/static/1f51275a2e7d1a648b4f30a4d852ea16/34e07/old-site-ss.jpg 1911w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/0f6928752cf31a578914fc0567023128/34e07/old-site-ss-sokoban.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"81%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFAQT/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABp66UneNF/8QAGhAAAgIDAAAAAAAAAAAAAAAAAAIDExIxMv/aAAgBAQABBQKiMoiKIht5sJx//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGxAAAgIDAQAAAAAAAAAAAAAAAAECMwMhkTL/2gAIAQEABj8C3jRXHhXHgj0xH//EABoQAAICAwAAAAAAAAAAAAAAAAABEBExYeH/2gAIAQEAAT8h5mEOAR2YC7fo/9oADAMBAAIAAwAAABAvz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABsQAQADAAMBAAAAAAAAAAAAAAEAESEQQVFh/9oACAEBAAE/EMTT9tB5754+OLehse8IFTam17n/2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Screenshot of the old sokoban page\",\n    \"title\": \"Screenshot of the old sokoban page\",\n    \"src\": \"/static/0f6928752cf31a578914fc0567023128/e5166/old-site-ss-sokoban.jpg\",\n    \"srcSet\": [\"/static/0f6928752cf31a578914fc0567023128/f93b5/old-site-ss-sokoban.jpg 300w\", \"/static/0f6928752cf31a578914fc0567023128/b4294/old-site-ss-sokoban.jpg 600w\", \"/static/0f6928752cf31a578914fc0567023128/e5166/old-site-ss-sokoban.jpg 1200w\", \"/static/0f6928752cf31a578914fc0567023128/d9c39/old-site-ss-sokoban.jpg 1800w\", \"/static/0f6928752cf31a578914fc0567023128/34e07/old-site-ss-sokoban.jpg 1911w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/1afdb16928cd10be0482ce8579b41777/34e07/old-site-ss-history.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"81%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACA//EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAVp31DyY/8QAGhAAAgIDAAAAAAAAAAAAAAAAAgMAEwEQEf/aAAgBAQABBQIwAToVKFRmOnr/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAeEAABAgcBAAAAAAAAAAAAAAACADMBAxATISIxUf/aAAgBAQAGPwKWNsdu4TYpsUEfK//EABoQAQEBAAMBAAAAAAAAAAAAAAEAESEx4WH/2gAIAQEAAT8h35izXSPNnxJQEBciQ/STb//aAAwDAQACAAMAAAAQc8//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAeEAEAAgIBBQAAAAAAAAAAAAABABEhMUFRcYGRof/aAAgBAQABPxAyMaWIKyN43EmfVhkrR0x9MWwXs8S4PtNizxP/2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Screenshot of the old history page\",\n    \"title\": \"Screenshot of the old history page\",\n    \"src\": \"/static/1afdb16928cd10be0482ce8579b41777/e5166/old-site-ss-history.jpg\",\n    \"srcSet\": [\"/static/1afdb16928cd10be0482ce8579b41777/f93b5/old-site-ss-history.jpg 300w\", \"/static/1afdb16928cd10be0482ce8579b41777/b4294/old-site-ss-history.jpg 600w\", \"/static/1afdb16928cd10be0482ce8579b41777/e5166/old-site-ss-history.jpg 1200w\", \"/static/1afdb16928cd10be0482ce8579b41777/d9c39/old-site-ss-history.jpg 1800w\", \"/static/1afdb16928cd10be0482ce8579b41777/34e07/old-site-ss-history.jpg 1911w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/82f1a45db450ed94d7638f146aa91bfd/34e07/old-site-ss-pubs.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"81%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEEBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAdN1MmKQ/8QAFxAAAwEAAAAAAAAAAAAAAAAAAAMTIP/aAAgBAQABBQKCyCiCsf/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABoQAAICAwAAAAAAAAAAAAAAAAACATMDICH/2gAIAQEABj8C7jgrUrXT/8QAHBAAAgEFAQAAAAAAAAAAAAAAAAERECFBseHx/9oACAEBAAE/IbeiecLnDU5Ip//aAAwDAQACAAMAAAAQIM//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAYEAEBAQEBAAAAAAAAAAAAAAABEQAQIf/aAAgBAQABPxBircE3UVxaJEwp68//2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Screenshot of the publications page\",\n    \"title\": \"Screenshot of the publications page\",\n    \"src\": \"/static/82f1a45db450ed94d7638f146aa91bfd/e5166/old-site-ss-pubs.jpg\",\n    \"srcSet\": [\"/static/82f1a45db450ed94d7638f146aa91bfd/f93b5/old-site-ss-pubs.jpg 300w\", \"/static/82f1a45db450ed94d7638f146aa91bfd/b4294/old-site-ss-pubs.jpg 600w\", \"/static/82f1a45db450ed94d7638f146aa91bfd/e5166/old-site-ss-pubs.jpg 1200w\", \"/static/82f1a45db450ed94d7638f146aa91bfd/d9c39/old-site-ss-pubs.jpg 1800w\", \"/static/82f1a45db450ed94d7638f146aa91bfd/34e07/old-site-ss-pubs.jpg 1911w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/046bff19841cc1dd9993c5dd4aa718bd/34e07/old-site-ss-astar.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"81%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAgX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHUliwqNB//xAAXEAADAQAAAAAAAAAAAAAAAAAAAxMg/9oACAEBAAEFAoKIJIKx/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGhAAAgIDAAAAAAAAAAAAAAAAAAIzkQEgMv/aAAgBAQAGPwLjBGtEa1p//8QAGhAAAgIDAAAAAAAAAAAAAAAAARAAMREhkf/aAAgBAQABPyHLfNQJagA2/wD/2gAMAwEAAgADAAAAEBAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAAIDAQAAAAAAAAAAAAAAAQARMUFxEP/aAAgBAQABPxAznIO7sqWE4lDHW78cz//Z')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Screenshot of the old astar page\",\n    \"title\": \"Screenshot of the old astar page\",\n    \"src\": \"/static/046bff19841cc1dd9993c5dd4aa718bd/e5166/old-site-ss-astar.jpg\",\n    \"srcSet\": [\"/static/046bff19841cc1dd9993c5dd4aa718bd/f93b5/old-site-ss-astar.jpg 300w\", \"/static/046bff19841cc1dd9993c5dd4aa718bd/b4294/old-site-ss-astar.jpg 600w\", \"/static/046bff19841cc1dd9993c5dd4aa718bd/e5166/old-site-ss-astar.jpg 1200w\", \"/static/046bff19841cc1dd9993c5dd4aa718bd/d9c39/old-site-ss-astar.jpg 1800w\", \"/static/046bff19841cc1dd9993c5dd4aa718bd/34e07/old-site-ss-astar.jpg 1911w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/fdc39f6cc9c2298d470c11925987e5f1/34e07/old-site-ss-lextop.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"81%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQBA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAG7O5Ckv//EABcQAAMBAAAAAAAAAAAAAAAAAAACAwH/2gAIAQEAAQUCpOaYqSY2Ei82cRGw0//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB0QAAIBBAMAAAAAAAAAAAAAAAABAhESITMQI1H/2gAIAQEABj8C0pi6Y5NcRWtKgq2484//xAAcEAEAAgEFAAAAAAAAAAAAAAABABFxITFBYeH/2gAIAQEAAT8hANt4h2lyGp4iKvtBcdzCG2bp/9oADAMBAAIAAwAAABBPD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABsQAAIDAQEBAAAAAAAAAAAAAAERACFRcTFB/9oACAEBAAE/EC6LEWAIG3DZbIgEUPq5ASMcy9wm9mslqjMKoO9lgr5P/9k=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Screenshot of the old lextop page\",\n    \"title\": \"Screenshot of the old lextop page\",\n    \"src\": \"/static/fdc39f6cc9c2298d470c11925987e5f1/e5166/old-site-ss-lextop.jpg\",\n    \"srcSet\": [\"/static/fdc39f6cc9c2298d470c11925987e5f1/f93b5/old-site-ss-lextop.jpg 300w\", \"/static/fdc39f6cc9c2298d470c11925987e5f1/b4294/old-site-ss-lextop.jpg 600w\", \"/static/fdc39f6cc9c2298d470c11925987e5f1/e5166/old-site-ss-lextop.jpg 1200w\", \"/static/fdc39f6cc9c2298d470c11925987e5f1/d9c39/old-site-ss-lextop.jpg 1800w\", \"/static/fdc39f6cc9c2298d470c11925987e5f1/34e07/old-site-ss-lextop.jpg 1911w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \"))))), mdx(\"p\", null, \"Thus the site slowly stopped being updated. What I really wanted was a content management\\nsystem that I could edit and update, but would deploy to static HTML for serving. Much\\nlike a compiler produces exectable code, it felt like there should be a \\\"compiler\\\" for\\ngenerating HTML pages.\"), mdx(\"h2\", null, \"Enter Gatsby\"), mdx(\"p\", null, \"It's 2021 and as I was looking around, I came across \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.gatsbyjs.com/\"\n  }), \"Gatsbyjs\"), \",\\nwhich seemed to do exactly what I had wanted. Gatsby \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"isn't\"), \" a content management system,\\nrather it is a framework that lets you roll your own. It takes the site that you create\\nand builds it to static files that you can then upload directly to your web server. Why\\nuse it?\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Gatsby takes care of the optimization of the pages\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"It's a plug-in based system, so you take the parts you need\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"gatsby-plugin-sharp\"), \" optimizes images\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"lots of other plugins, such as for \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"sass\"), \" etc.\")), mdx(\"h2\", null, \"Enter Bulma\"), mdx(\"p\", null, \"I wanted to make the site mobile friendly. \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://bulma.io/\"\n  }), \"Bulma\"), \" is a CSS framework\\nthat has nice responsive support. The caution with using a framework is that your site can\\nend up looking \\\"more like everyone else than anyone else\\\".\"), mdx(\"h2\", null, \"Two columns are better than one\"), mdx(\"p\", null, \"I've always preferred the two-column format for academic papers. Thinking about web pages,\\nit seemed that a two column format would make more sense. Initially I thought about having\\nthe content spill over two columns. However, that would be awkward to read, because visitors\\nwould have to scroll back up to the top to read the second column. It would look great on\\nmobile where you can just scroll through it.\"), mdx(\"p\", null, \"This is how we ended up with the site's current design, where on a wide screen the left\\ncolumn is one level higher on the tree. On mobile you didn't need to see the left page and\\nso it is hidden on a portrait display.\"), mdx(\"h2\", null, \"MDX, frontmatter, and graphql\"), mdx(\"p\", null, \"MDX is markdown that allows JSX in it. It's like having the best of both worlds because\\nyou get the convenience and legibility of markdown, but the power of JSX when needed. The\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"gatsby-plugin-mdx\"), \" plugin allows you to annotate mdx files with frontmatter. These are\\nfields that can then be used in graphql queries. While this is incredibly convenient for\\na blog style site like this one, it doesn't seem to scale at all as the frontmatter isn't\\nscoped. That means, for example, if \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"image\"), \" is an image object type in one mdx, it can't\\nbe a different type in another mdx file, even if those mdx files come from different\\nsources.\"));\n}\n;\nMDXContent.isMDXComponent = true;","fileAbsolutePath":"C:/Users/alex/Documents/gatsby/g-talistreit-com/src/posts/test.mdx","excerpt":"Building This website Back in 2005 I hand crafted HTML pages and a CSS stylesheet. It worked and the site was\nfast to deliver but not…","frontmatter":{"date":"January 27, 2021","title":"Building this website","category":"code","short":"This website was built using gatsby, mdx, and bulma. This is a discussion on why.","image":{"childImageSharp":{"fixed":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAeSlIDWgA//EABgQAAIDAAAAAAAAAAAAAAAAAAEQABEh/9oACAEBAAEFAlZewP8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAFBABAAAAAAAAAAAAAAAAAAAAMP/aAAgBAQAGPwIf/8QAHhAAAgIABwAAAAAAAAAAAAAAAAEQESExQVFhcfD/2gAIAQEAAT8htsd7nILIx8jpDSP/2gAMAwEAAgADAAAAEDPIPP/EABURAQEAAAAAAAAAAAAAAAAAAAEg/9oACAEDAQE/ECP/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAeEAACAQQDAQAAAAAAAAAAAAABEQAhMVFhQXGRof/aAAgBAQABPxAAXa2YeNdxFPkxvGJgRbaIufkFg9CGjIMhy1EJ/9k=","width":96,"height":96,"src":"/static/aac9d8e253da8b6e9fbfe9f46bd5d897/eee8e/new-site-code.jpg","srcSet":"/static/aac9d8e253da8b6e9fbfe9f46bd5d897/eee8e/new-site-code.jpg 1x,\n/static/aac9d8e253da8b6e9fbfe9f46bd5d897/9d183/new-site-code.jpg 1.5x,\n/static/aac9d8e253da8b6e9fbfe9f46bd5d897/cc017/new-site-code.jpg 2x"}}}},"slug":"test"}},{"node":{"id":"4539cb56-f00b-5e4a-a4b5-928afcf87f4e","body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"date\": \"2020-12-25\",\n  \"title\": \"Critmas 2020\",\n  \"category\": \"games\",\n  \"image\": \"../images/group9_mini.jpeg\",\n  \"short\": \"2020 was the year that we all learned to play D&D over the Internet. Here is a sketch of my awesome players.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"Critmas 2020\"), mdx(\"p\", null, \"2020 was the year that I learned to play Dungeons & Dragons, which is a great way to\\nkeep up socially with friends. \"), mdx(\"p\", null, \"I ran two groups through a heavily modified Lost Mine of Phandelver campaign.\\nThey reached the same point in the adventure at the same time, allowing us to\\nhave a \\\"Critmas Special\\\" where both groups met in an alternative universe.\"), mdx(\"p\", null, \"It was very rewarding for me as a DM to watch the two groups interact and find\\nout how their adventures differed.\"), mdx(\"p\", null, \"Anyway, here is a sketch of the group that I did:\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1200px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/d548048d22b26f999fefb4df8b4a8668/80c67/group9.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"71.33333333333334%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB3VAH/8QAFhABAQEAAAAAAAAAAAAAAAAAERAA/9oACAEBAAEFAnML/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAFhABAQEAAAAAAAAAAAAAAAAAABEB/9oACAEBAAE/IdMKhEf/2gAMAwEAAgADAAAAEDPP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGxABAAEFAQAAAAAAAAAAAAAAAQARIUFRcTH/2gAIAQEAAT8Q9aWxFR2GoV4ZYodgZ3P/2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Drawing of D&D characters\",\n    \"title\": \"Drawing of D&D characters\",\n    \"src\": \"/static/d548048d22b26f999fefb4df8b4a8668/e5166/group9.jpg\",\n    \"srcSet\": [\"/static/d548048d22b26f999fefb4df8b4a8668/f93b5/group9.jpg 300w\", \"/static/d548048d22b26f999fefb4df8b4a8668/b4294/group9.jpg 600w\", \"/static/d548048d22b26f999fefb4df8b4a8668/e5166/group9.jpg 1200w\", \"/static/d548048d22b26f999fefb4df8b4a8668/d9c39/group9.jpg 1800w\", \"/static/d548048d22b26f999fefb4df8b4a8668/df51d/group9.jpg 2400w\", \"/static/d548048d22b26f999fefb4df8b4a8668/80c67/group9.jpg 3500w\"],\n    \"sizes\": \"(max-width: 1200px) 100vw, 1200px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")));\n}\n;\nMDXContent.isMDXComponent = true;","fileAbsolutePath":"C:/Users/alex/Documents/gatsby/g-talistreit-com/src/posts/2020-12-20-critmas.mdx","excerpt":"Critmas 2020 2020 was the year that I learned to play Dungeons & Dragons, which is a great way to \nkeep up socially with friends.  I ran two…","frontmatter":{"date":"December 25, 2020","title":"Critmas 2020","category":"games","short":"2020 was the year that we all learned to play D&D over the Internet. Here is a sketch of my awesome players.","image":{"childImageSharp":{"fixed":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAECAwQF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB9ms0OhAZBgD/xAAbEAEAAgIDAAAAAAAAAAAAAAABAAIREiIxQf/aAAgBAQABBQL2+yHUK5lHNWLxu6P/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAcEAACAgIDAAAAAAAAAAAAAAAAARARAhIhQYH/2gAIAQEABj8C28R0p5ixZFI//8QAGhAAAwEBAQEAAAAAAAAAAAAAAAERITFBof/aAAgBAQABPyFS50MNtHuHK9Enrm8gv0j+iKIy0nahmzRvmyn/2gAMAwEAAgADAAAAEJPIAP/EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8QH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8QH//EACAQAQACAQQCAwAAAAAAAAAAAAERIQAxQXGBUWGhscH/2gAIAQEAAT8QSclEHkLnv6DA1NYC2nvbJsyRS8VjhZDril5T8yYIAYGuWvxgJBJdMBUID7Fi8nlM1DYp26ya8IW8uuf/2Q==","width":96,"height":96,"src":"/static/cd76f71b17afe64bf6685ba5855273aa/eee8e/group9_mini.jpg","srcSet":"/static/cd76f71b17afe64bf6685ba5855273aa/eee8e/group9_mini.jpg 1x,\n/static/cd76f71b17afe64bf6685ba5855273aa/9d183/group9_mini.jpg 1.5x,\n/static/cd76f71b17afe64bf6685ba5855273aa/cc017/group9_mini.jpg 2x"}}}},"slug":"2020-12-20-critmas"}},{"node":{"id":"07bf15d5-b9ca-5926-9e40-1effff450bf6","body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"date\": \"2020-08-01\",\n  \"title\": \"Stealth Variant Rules\",\n  \"category\": \"games\",\n  \"image\": \"../images/dnd-ampersand-logo.png\",\n  \"short\": \"Variant rules for running stealth missions in D&D faster and more engaging.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"Stealth Variant Rules\"), mdx(\"p\", null, \"Rules as written make stealth missions near impossible. If you're playing with\\na map, then the stealthy members of the party are undone by the poor stealth of\\ntheir companions. Alternatively, the stealthy characters go on ahead, leaving\\nthe other players with little to do (i.e. bored).\"), mdx(\"p\", null, \"I have a variant rule that I run that speeds stealth missions up and keeps the\\nrest of the party interested. The way it works is that \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"em\", {\n    parentName: \"strong\"\n  }, \"as long as\")), \" the party\\nstays 10' behind \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"em\", {\n    parentName: \"strong\"\n  }, \"and\")), \" don't stray onto a square that hasn't already been covered\\nby the scout, they inherit the stealth roll of the scout.\"), mdx(\"h2\", null, \"How does this work?\"), mdx(\"p\", null, \"The players that want to be scouts roll their stealth rolls. The rest of the\\nparty follows behind, forming a kind of conga line. As the DM you only need\\nto consider the scouts. If the rest of the party steps out of line, I ask them\\nto make a stealth roll.\"), mdx(\"p\", null, \"Everyone gets to move concurrently, which is why the 10' exclusion zone helps.\\nPerception is generally only rolled by the scouts, but doesn't have to be.\"), mdx(\"p\", null, \"I typically allow everyone to move one or two squares at a time, giving a\\nsense of creeping forward.\"), mdx(\"h2\", null, \"Are there down sides?\"), mdx(\"p\", null, \"The advantage or disadvantage of this approach, depending on your perspective,\\nis that if combat starts, the party is together. I personally prefer it this\\nway because to me D&D is a social game centered around a shared experience.\"), mdx(\"h2\", null, \"But if you change the rules you aren't playing the game!\"), mdx(\"p\", null, \"If you think this rule breaks the game, you'll hate the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/games/2021-02-08-no-initiative\"\n  }), \"no initiative rules\"), \"!\"));\n}\n;\nMDXContent.isMDXComponent = true;","fileAbsolutePath":"C:/Users/alex/Documents/gatsby/g-talistreit-com/src/posts/2020-08-01-stealth-variant.mdx","excerpt":"Stealth Variant Rules Rules as written make stealth missions near impossible. If you're playing with\na map, then the stealthy members of the…","frontmatter":{"date":"August 01, 2020","title":"Stealth Variant Rules","category":"games","short":"Variant rules for running stealth missions in D&D faster and more engaging.","image":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAC4jAAAuIwF4pT92AAAC6ElEQVQ4y42UXYhMYRjHzzmzVtmkuPA1Zs7M7JzZyeJCPlKkKJIbq6Swd8jXRtwgWiXcuFmSsApFKWVvpG2vJDcIEYq42F2787W7tOw2lvH/v+//bJMLa+o3z/vxvM/7fL3HyfmB05fIOKVYvZP3g13gLaiAAmjD/nRI7rmU1P/nD4bcUjzNAxdoqBBP01gR/NL4BYxMy8nohAZ1+/oqYzf6E5layLVgUGtH8z4ujacjExosWO9aTYjxoIIDi3iJ1h/I4D2mZCCW+m8P94Em8AQHmsGyfj+Yifmr0OsiLgAeDSICp1+55/wL5MdgvsFsYmMGNprAGhw+Ax5hvAeyXQXaposjMubiIg+wUDXC3buhxXqIw2nI5+A1OAd6QWfOVr0FcmrO6rlD81LGO6ZEaRknlwjGDS6AHFZ4o+CN5EumQwdraLQ8O0aDbKUDmO+APMhLQYPJL/42YdIjYx3gvHqQ807wFTpR2zbpSZifBbfAe1CSHnkIncXIYTAXkyvgA3IZDfsRXATHWXnI0z2pbC2LhfF90AXWgSTYiHXf5NcPpjCUm1hYAnaDjCp+FeMVYBXG18EP7e0E38Dy6tyFMLeOCnGKTazq8iDT0AYOM2xUNoP1hfL8hHI6GWsePRP2WWLws+qVdFAZG1tY7eFowlE+GeJJFgB7dWzy7lTWeKTqs+IeO4ADGhvV7c1527gR64XxZH/e6nD/cm/SPEv2bh306OUcFo1raHw3NFj+q4FrFRJvZ+KPsKIy+hRrjZCXwKFP6UZPPbydTjhh70neLdqQw/5MKeTHLBrkgPR+hxEN2s8eH8IQv0qhh2MFPxiT0jWw2oTqB30yUJFXd0J95f42eCad72wjR+6WjSJkVaOGeTOfr6KtbJfaZkSGrY7t1Xbq4EvRUIfJ1nGj1YrWWGsxXh/2GlvpGB+B9kf4Qvj0upNZz/QhP0HKVwOrCN4JNvRSJppfdRVoFg7FsL6ZeZTRz1hfqQu9PwnTW/HghOIXAAAAAElFTkSuQmCC","width":96,"height":96,"src":"/static/1598f4604b239a1d15b5dc1106f077a5/88b72/dnd-ampersand-logo.png","srcSet":"/static/1598f4604b239a1d15b5dc1106f077a5/88b72/dnd-ampersand-logo.png 1x,\n/static/1598f4604b239a1d15b5dc1106f077a5/a12fc/dnd-ampersand-logo.png 1.5x,\n/static/1598f4604b239a1d15b5dc1106f077a5/f20a7/dnd-ampersand-logo.png 2x"}}}},"slug":"2020-08-01-stealth-variant"}},{"node":{"id":"3ebfc4b7-25c9-5058-8235-c2d0c988b57d","body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"date\": \"2002-11-21\",\n  \"title\": \"TALOD Vertex Reduction\",\n  \"category\": \"code\",\n  \"image\": \"../images/talod.jpeg\",\n  \"short\": \"What if we could dynamically change the level of detail for 3D objects? A Hardware-optimized dynamic LOD method.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"TALOD Vertex Reduction\"), mdx(\"p\", null, \"The following was submitted to flipcode in 2002:\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"640px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/65eb2d666dbb091af14632aefabf18dd/c08c5/11-21-2002.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"75%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAECBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHGUtIAX//EABkQAAMAAwAAAAAAAAAAAAAAAAABERAhMf/aAAgBAQABBQIXI8LRD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABcQAQADAAAAAAAAAAAAAAAAABAAIWH/2gAIAQEABj8Clun/xAAaEAEBAQEBAQEAAAAAAAAAAAARAQAxIUFh/9oACAEBAAE/IaA2+dNBCq8s1+CbwI3CJ38ZXm//2gAMAwEAAgADAAAAEGfP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGxABAQEBAAMBAAAAAAAAAAAAAREAITFBUWH/2gAIAQEAAT8QIdFHXY/NSJpWofuQ0L0ZlKYkKoUcEF6dgky6hR8VN//Z')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Screenshot of TALOD\",\n    \"title\": \"Screenshot of TALOD\",\n    \"src\": \"/static/65eb2d666dbb091af14632aefabf18dd/c08c5/11-21-2002.jpg\",\n    \"srcSet\": [\"/static/65eb2d666dbb091af14632aefabf18dd/f93b5/11-21-2002.jpg 300w\", \"/static/65eb2d666dbb091af14632aefabf18dd/b4294/11-21-2002.jpg 600w\", \"/static/65eb2d666dbb091af14632aefabf18dd/c08c5/11-21-2002.jpg 640w\"],\n    \"sizes\": \"(max-width: 640px) 100vw, 640px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"These screenshots were taken from my undergrad project. The aim of the project was to have a look at developing a high performance progressive mesh and explore its application.\"), mdx(\"p\", null, \"The image shows 4 screen shots. Each shot is of the same scene using a different mechanism to render it. In the top right of each shot the frame-rate is displayed. At the bottom right the number of visbible triangles (frustum clipping) is shown, along side the number of triangles actually drawn (by the rendering mechanism, labeled \\\"Tris drawn\\\").\"), mdx(\"p\", null, \"The screen shots are taken on a horribly old machine (Pentium 200), and show how the scene rendered at full detail results in a frame-rate of 1.11 fps (top left). top right: shows a visually conforming rendition, where only as much detail is removed as to be imperceptible (4.55 fps). bottom left: distribution of 20002 polygons accross the scene (20.83 fps) bottom right: shows a system that reduces detail until the fps reaches 50-55k (52.38 fps)\"), mdx(\"p\", null, \"The program shown uses OpenGL and GLUT, and runs under both windows and linux (well, most *nix).\"), mdx(\"p\", null, \"The data structure I made basically does not touch the vertex list, and uses the glDrawElements command to fire the objects at the card. The same reference mesh is used by multiple instaces of the same object.\"), mdx(\"p\", null, \"The mesh is always at some given LOD (level of detail), and has additional information that allows it to transition incrementally to any desired LOD. Each level of LOD has an associated error term that allows us to intelligently distribute polygons accross the scene giving preference to details that are more important.\"), mdx(\"p\", null, \"As with standard PMs (Progressive Meshes), this incremental data is stored on disk in most significant to least significant order.\"), mdx(\"p\", null, \"It was basically an excercise at developing a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"FAST\"), \" PM, and exploring the ways of making use of it. The best feature of this whole excercise, in my opinion, is the idea of scalable games:\"), mdx(\"p\", null, \"Basically, because of the ordering of the data, we only need to read as much information as we are interested in. This means that we can have a 150mb model on disk, but only read 150k of it. Reading that 150k gives us a lower detail approximation of the full blown model. We then use this in the game, because the game does not need much detail. However, in the future, when they get their Geforce-18, the game can read all of the data......\"), mdx(\"p\", null, \"There are a lot of advanced topics that I didn't get to touch, because this is a \\\"single subject\\\" project... however I will be returning to do post-graduate work continuing in this area, so hopefully I'll have some more things to send you guys.\"));\n}\n;\nMDXContent.isMDXComponent = true;","fileAbsolutePath":"C:/Users/alex/Documents/gatsby/g-talistreit-com/src/posts/talod.mdx","excerpt":"TALOD Vertex Reduction The following was submitted to flipcode in 2002: These screenshots were taken from my undergrad project. The aim of…","frontmatter":{"date":"November 21, 2002","title":"TALOD Vertex Reduction","category":"code","short":"What if we could dynamically change the level of detail for 3D objects? A Hardware-optimized dynamic LOD method.","image":{"childImageSharp":{"fixed":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAIDAQX/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAfEu4TBsIoODN//EABsQAQACAgMAAAAAAAAAAAAAAAIAARESISNB/9oACAEBAAEFAtliicQkama1c8J66PH/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAeEAABAwQDAAAAAAAAAAAAAAARAAEQAiIyQWGB0f/aAAgBAQAGPwLJEw9x6Q1yvIqeP//EABsQAQEBAQEBAQEAAAAAAAAAAAERACExUYGx/9oACAEBAAE/IRkUHzM8Aet7k7zzL6YLzzkWJx1GAVp+J/ckRWfMDS0xNO//2gAMAwEAAgADAAAAEK8fwv/EABYRAAMAAAAAAAAAAAAAAAAAAAAQEf/aAAgBAwEBPxAr/8QAFhEAAwAAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/EKz/xAAdEAEAAgIDAQEAAAAAAAAAAAABABEhMVFhcYGh/9oACAEBAAE/EHEhu273iB7NgIHo4maq0tK5q5eKMlA7rv5AhW0kvl8S/aLoL9RWNa3LFylLhocPsL2W9z//2Q==","width":96,"height":96,"src":"/static/bd7515f3c4a873aae6fb90b5af3f23de/eee8e/talod.jpg","srcSet":"/static/bd7515f3c4a873aae6fb90b5af3f23de/eee8e/talod.jpg 1x,\n/static/bd7515f3c4a873aae6fb90b5af3f23de/9d183/talod.jpg 1.5x"}}}},"slug":"talod"}},{"node":{"id":"0cf72c0a-4983-5723-8386-eb262888f1a2","body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"date\": \"1995-01-01\",\n  \"title\": \"Years 1995-2001\",\n  \"category\": \"code\",\n  \"image\": \"../images/vr97_1.jpeg\",\n  \"short\": \"Games, Multimedia, Accounting, Graphics, and Visualization projects\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"Years 1995-2001\"), mdx(\"p\", null, \"The trouble with going this far back in history when you have a transient life is that source code gets lost.\"), mdx(\"h2\", null), mdx(\"h2\", null, \"1995: Biologica\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"160px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/40971a3056d81e3e6015350f4c63cdc3/0913d/biol_2.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"74.37499999999999%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFAgT/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAZvapjiYbJ//xAAZEAADAQEBAAAAAAAAAAAAAAABAgMRBBL/2gAIAQEAAQUCn6qzc+IxIKSvEml2VpPv/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oACAEDAQE/AcR//8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/Aamv/8QAHRAAAQQCAwAAAAAAAAAAAAAAAQACERIhMVFhkf/aAAgBAQAGPwKoKmzpHaiT6rBg1yi2rcrS/8QAGxAAAwACAwAAAAAAAAAAAAAAAAERITFRYdH/2gAIAQEAAT8hXbUryV0gUt7CfueVPSMtJmGyTHZ//9oADAMBAAIAAwAAABBHL//EABkRAAIDAQAAAAAAAAAAAAAAAAABESExQf/aAAgBAwEBPxBy60Ys/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERIf/aAAgBAgEBPxAW1I//xAAZEAEBAQEBAQAAAAAAAAAAAAABETEAIVH/2gAIAQEAAT8QGUFos8AydRhQzZsOZimI86f9ZcJucaEFwQfnveWREw9//9k=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"image\",\n    \"title\": \"image\",\n    \"src\": \"/static/40971a3056d81e3e6015350f4c63cdc3/0913d/biol_2.jpg\",\n    \"srcSet\": [\"/static/40971a3056d81e3e6015350f4c63cdc3/0913d/biol_2.jpg 160w\"],\n    \"sizes\": \"(max-width: 160px) 100vw, 160px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), \"Complete Multimedia authoring system that was used to make several educational titles, including the award winning Biologica.\")))), mdx(\"h2\", null), mdx(\"h2\", null, \"1996: Tutor Maker\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"160px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/443a1dc787a077fb7717d44e4f8507da/0913d/tute_2.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"70%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBBAX/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/9oADAMBAAIQAxAAAAFy3S88YthH/8QAGRAAAgMBAAAAAAAAAAAAAAAAAQIAAxIR/9oACAEBAAEFAlwQeQiLbVlra8luz//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/AUf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAaEAACAwEBAAAAAAAAAAAAAAABAgAQESGR/9oACAEBAAY/AhxPY1DVMOKa/8QAGxABAAMBAAMAAAAAAAAAAAAAAQARMSFBgZH/2gAIAQEAAT8hFANEENXTx09RRx+QA2qLmyNcmuqn/9oADAMBAAIAAwAAABAM7//EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQMBAT8QchOn/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/EKmv/8QAHBABAAIDAAMAAAAAAAAAAAAAAQARITFBcaGx/9oACAEBAAE/EFhYBui47iFxcDYp2j096Mk1kBlrzKqTHbX2Xw66oZ//2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"image\",\n    \"title\": \"image\",\n    \"src\": \"/static/443a1dc787a077fb7717d44e4f8507da/0913d/tute_2.jpg\",\n    \"srcSet\": [\"/static/443a1dc787a077fb7717d44e4f8507da/0913d/tute_2.jpg 160w\"],\n    \"sizes\": \"(max-width: 160px) 100vw, 160px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), \"An interactive tutorial and examination system, allowing teachers to create electronic quizzes and exams for their students\")))), mdx(\"h2\", null), mdx(\"h2\", null, \"1997: Virtual Resume\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"160px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/3b0b65e5a8b3d2b910b82e07b4815bc8/0913d/vr97_1.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"76.25%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBP/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/aAAwDAQACEAMQAAABxMgZuSC//8QAGRAAAwADAAAAAAAAAAAAAAAAAAECAxIh/9oACAEBAAEFAndJ72LJRZ1iP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/Aaf/xAAYEAADAQEAAAAAAAAAAAAAAAAAATIgIf/aAAgBAQAGPwLjKZTx/8QAGhABAAIDAQAAAAAAAAAAAAAAAQARITFBYf/aAAgBAQABPyGtrKnREmZEW77EC/Jpkn//2gAMAwEAAgADAAAAEKMf/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Qp//EABYRAQEBAAAAAAAAAAAAAAAAAAARMf/aAAgBAgEBPxDCv//EABsQAQADAAMBAAAAAAAAAAAAAAEAESFBUWFx/9oACAEBAAE/EG65b9ga0udxl9sesrNWK4RsBgITDKdT/9k=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"image\",\n    \"title\": \"image\",\n    \"src\": \"/static/3b0b65e5a8b3d2b910b82e07b4815bc8/0913d/vr97_1.jpg\",\n    \"srcSet\": [\"/static/3b0b65e5a8b3d2b910b82e07b4815bc8/0913d/vr97_1.jpg 160w\"],\n    \"sizes\": \"(max-width: 160px) 100vw, 160px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), \"A fully interactive multimedia resume, complete with music and sound effects. It could print out a copy of my regular resume. It even had a built in email client allowing people to send me email using SMTP.\")))), mdx(\"h2\", null), mdx(\"h2\", null, \"1998-2000: Enterprise Software\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"160px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/aca4ed29f57628130a849ceb308a06fd/0913d/acc.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"76.25%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHXnecMYf/EABcQAAMBAAAAAAAAAAAAAAAAABARIQD/2gAIAQEAAQUCWoiH/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFhAAAwAAAAAAAAAAAAAAAAAAACAx/9oACAEBAAY/AiL/AP/EABsQAAICAwEAAAAAAAAAAAAAAAABESExQVFx/9oACAEBAAE/IcZo8hKVaSF00KiT/9oADAMBAAIAAwAAABBIL//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EAB0QAQACAgIDAAAAAAAAAAAAAAEAESExQVFxkeH/2gAIAQEAAT8QC4tL1B4e/wCRrEOtxgWrwgeDfmADNz//2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"image\",\n    \"title\": \"image\",\n    \"src\": \"/static/aca4ed29f57628130a849ceb308a06fd/0913d/acc.jpg\",\n    \"srcSet\": [\"/static/aca4ed29f57628130a849ceb308a06fd/0913d/acc.jpg 160w\"],\n    \"sizes\": \"(max-width: 160px) 100vw, 160px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), \"For a while I wrote various modules for the ACCPAC ERP system. Time billing, job costing, ledger backup and diagnostic tools.\")))), mdx(\"h2\", null), mdx(\"h2\", null, \"2001: Tourism Booking system\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  })))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"160px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/0f4f8a4b985e91239399114bf0e589b6/0913d/tour_1.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"70.625%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAECBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHRXgCP/8QAGRAAAgMBAAAAAAAAAAAAAAAAABEBECFB/9oACAEBAAEFAlBl8Z//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAXEAADAQAAAAAAAAAAAAAAAAAAATEg/9oACAEBAAY/AoiZ/8QAHBAAAQMFAAAAAAAAAAAAAAAAEQABECFBUYGh/9oACAEBAAE/IaZ5IBZoICHfCH//2gAMAwEAAgADAAAAENAv/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Qh//EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAECAQE/EKr/xAAcEAADAAIDAQAAAAAAAAAAAAAAAREhMVFhcYH/2gAIAQEAAT8QVlD8ixHXsphR86IkLdKPrY6mNI//2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"image\",\n    \"title\": \"image\",\n    \"src\": \"/static/0f4f8a4b985e91239399114bf0e589b6/0913d/tour_1.jpg\",\n    \"srcSet\": [\"/static/0f4f8a4b985e91239399114bf0e589b6/0913d/tour_1.jpg 160w\"],\n    \"sizes\": \"(max-width: 160px) 100vw, 160px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), \"A blazingly fast and feature rich reservation system. The objective was to be easy to use and fast. It included a sophisticated report generation system, which offered powerful queries to produce HTML and PDF output.\")))));\n}\n;\nMDXContent.isMDXComponent = true;","fileAbsolutePath":"C:/Users/alex/Documents/gatsby/g-talistreit-com/src/posts/old-projects.mdx","excerpt":"Years 1995-2001 The trouble with going this far back in history when you have a transient life is that source code gets lost. 199…","frontmatter":{"date":"January 01, 1995","title":"Years 1995-2001","category":"code","short":"Games, Multimedia, Accounting, Graphics, and Visualization projects","image":{"childImageSharp":{"fixed":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQDAQL/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgD/2gAMAwEAAhADEAAAAY/c7TanS56BPQv/xAAaEAADAAMBAAAAAAAAAAAAAAAAAQIDERMx/9oACAEBAAEFAu1Cy2LJZBsQvdCP/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAGBAAAgMAAAAAAAAAAAAAAAAAADEgITL/2gAIAQEABj8CZoZcv//EAB8QAAIBAgcAAAAAAAAAAAAAAAABESFBMVFhcYGh0f/aAAgBAQABPyFZrhITfhDal9SFijUabVJRQsjSRaYn/9oADAMBAAIAAwAAABAQx73/xAAXEQEBAQEAAAAAAAAAAAAAAAABEQAQ/9oACAEDAQE/EGhem//EABgRAQEAAwAAAAAAAAAAAAAAAAEAETFB/9oACAECAQE/EF4WWdxf/8QAGxABAAMAAwEAAAAAAAAAAAAAAQARIUGB0XH/2gAIAQEAAT8QYIkBb6CNrVHD5S9lfjyWqEpSpOo5UNLDmFaZN3aWsZTuUIEAz//Z","width":96,"height":96,"src":"/static/3b0b65e5a8b3d2b910b82e07b4815bc8/eee8e/vr97_1.jpg","srcSet":"/static/3b0b65e5a8b3d2b910b82e07b4815bc8/eee8e/vr97_1.jpg 1x,\n/static/3b0b65e5a8b3d2b910b82e07b4815bc8/9d183/vr97_1.jpg 1.5x"}}}},"slug":"old-projects"}},{"node":{"id":"28b89d10-c568-513b-8f38-2ad28df5a708","body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"date\": \"1992-01-01\",\n  \"title\": \"IonCreation\",\n  \"category\": \"code\",\n  \"image\": \"../images/ion_4.jpeg\",\n  \"short\": \"A platformer game written using Microsoft QuickBasic 4.5 for MS-DOS. Download and play it using DOSBox!\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"IonCreation\"), mdx(\"p\", null, \"If you'd like to try it out, go \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/games/ioncreation-game\"\n  }), \"here\"), \".\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"160px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/c7a84bfda118b7bfd4c6ef1ead6840ac/0913d/ion_4.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"62.5%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHHVppKrI//xAAbEAEAAgIDAAAAAAAAAAAAAAABAhIAEQMTIv/aAAgBAQABBQJj5C0qmdew49JaB//EABYRAQEBAAAAAAAAAAAAAAAAAAASIf/aAAgBAwEBPwGGP//EABoRAAICAwAAAAAAAAAAAAAAAAABAhETMVH/2gAIAQIBAT8Byrpcno//xAAZEAACAwEAAAAAAAAAAAAAAAAAEQEhMQL/2gAIAQEABj8CdCNg3bGxR0f/xAAaEAADAQEBAQAAAAAAAAAAAAAAAREhcUHx/9oACAEBAAE/IYQpJ+MiJD7LNCb6rDFb4Ihn4f/aAAwDAQACAAMAAAAQtD//xAAYEQADAQEAAAAAAAAAAAAAAAAAASERsf/aAAgBAwEBPxBM8eQmPh//xAAaEQEAAgMBAAAAAAAAAAAAAAABACExUXHh/9oACAECAQE/EEhG17haw75P/8QAHRABAAICAgMAAAAAAAAAAAAAAQARITFBUZHB8P/aAAgBAQABPxA8FEVFvrUQLmNC0HvzBCxPrqKe2cpuGbqWGHMpwEsEz//Z')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"IonCreation Screenshot\",\n    \"title\": \"IonCreation Screenshot\",\n    \"src\": \"/static/c7a84bfda118b7bfd4c6ef1ead6840ac/0913d/ion_4.jpg\",\n    \"srcSet\": [\"/static/c7a84bfda118b7bfd4c6ef1ead6840ac/0913d/ion_4.jpg 160w\"],\n    \"sizes\": \"(max-width: 160px) 100vw, 160px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"This platformer game was written using Microsoft QuickBasic 4.5 for MS-DOS.\"), mdx(\"p\", null, \"It features 256 color hand drawn pixel graphics. To make the sprites I created a simple pixel drawing program.\"), mdx(\"h2\", null, \"Transparency issues\"), mdx(\"p\", null, \"This game was made in a time when we didn't have an alpha channel. Transparency was a big issue and most games simply used\\na flat color background. Ideally I would have used a color key, but QuickBasic didn't have that option. It\\ndid support logical operations, and that gave me an idea. If we create a mask bitmap, we can use the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"AND\"), \" operation to\\nclear out space for the opaque pixels followed by an \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"OR\"), \" operation to draw them in.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"center\", null, \"AND Mask\")), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"center\", null, \"OR Mask\")))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"120px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/a1164dd77ec9f2750c06dd26981b0b9a/070ae/ion-charmask-left.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"100%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAC4jAAAuIwF4pT92AAACGUlEQVQ4y5WUv8t5cRTH/axnEMWkDAYyWYwYDEomySzZlIFiUkoWVqMQyY9ZKf4ABhGLUooBpYgSCeF8O6fuzfN0v8+9z6lPn3s+9/S653Pe5x4R/LD3+0376/WCx+NBi3l+Pp+07vc7G8fsjImAwxAgxH7COIEMbDKZQCQSgVQqBdvtFhKJBHQ6HRgMBhCPx+mM6+P/Bc5mM8jlcmA0GsHpdEIoFAKdTgcGgwFEIhGB0bAEf7qy3+8ngNVqpR3X19cXjEYj4UAm6HQ6QTgcJgCCJBIJiMVikMlk/MBPddHW6zU4HA4IBAJgNpu/AfG53+/zZ4hQBjifz8FisbDXZEC4vF4vHA6H30X5bAHsObTFYgH5fJ6EQZDNZoNGowG73Y4zO07g5XIBu90OJpOJhECFlUolAbVaLZUBM59Op8IyPB6PoFarQaPRsFdk6oe7QqGgD/DWkAFuNhvw+XxQqVQIIJVKWWXRz2azEIvFoNvtCgOium63G8rl8jcx5HI5C8RWarfbwoDn8xmGwyFUq1XOK6fTaeqA1WrFPxw+26ZWqxFApVJBsVgEvV5PfjKZZGN/HQ7MSxxNaK1WiwClUon8Xq9HfiaTIf96vfJn+NkC0WiUAM1mk/zxeEy+x+Nh6yaoDzEoGAyytUNx0LBNmDOXywX7/V5YH95uNygUClCv10mY5XJJ5wjAvwQX/j3MPOQV5S8TnCv+HxACGki4SXHiAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Mask example\",\n    \"title\": \"Mask example\",\n    \"src\": \"/static/a1164dd77ec9f2750c06dd26981b0b9a/070ae/ion-charmask-left.png\",\n    \"srcSet\": [\"/static/a1164dd77ec9f2750c06dd26981b0b9a/070ae/ion-charmask-left.png 120w\"],\n    \"sizes\": \"(max-width: 120px) 100vw, 120px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"left\"\n  }), mdx(\"span\", _extends({\n    parentName: \"td\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"120px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/df3780f2452252b1cc72cd24cd6fd6c6/070ae/ion-character-left.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"100%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAC4jAAAuIwF4pT92AAACS0lEQVQ4y7WU3UvTURzGz/m9Ovfb3LuLtanDl6SM/ZgzNzdFEssVGQm5VsgSlMyQSJJIhLEuEi+ji8CbSOhP6La77vqbPp3chBCtTeji4ZznfA/Pec7h+R4hhOA8yBbEH+Pp+Rn4a/EiOLvgtwXXeiUjUUmXIRiNSXodQcgjuKrWbb1DQccSpEOSQlJyJSAYiUiyStRV40JaOz7wQlce8wtmuiWDau4qV64myKs1v9mBoJTN0VAun0dNjlI2HxIWjZjBrsJWSCfa6ZWDPsn6XQ8PCha1WYtnsya1vMmTCYOqqx+/ZVuCJ5GIhTS2lro5WPPy8p7N2pwSLjUFi4Mapn6BKwcdyfiQwaoSW58xuTms0xeQWHoHsfntcMnW2A9bvA/Z1P0WB0mbw/4uPl6yaShe8+h42xV0lLt3QZNdr+SHyuD3kOBLt+Cbis5Pxfd9gr2AwbApz+uaU4FWgo8VxsMBPk9n+XqrxOF8iU9FlyPFpy/HKat9w1q7gl0amzmdgYF+1l9ssddosPN2l83XO7xZrTGZSPBwTGc0arQnaFmqM4YEfX1JKsvL3CkvUJoqML+4yHYhx5zakxi0CPVoneUwlUpRrT6iWCwS7OkhM5lno5Rnyuzwc5Cy+TbhcJhyuUw8Hj/mXsWr7nXc1j699YZtO3Rdl0wmg8/na7ah41AMB7kdC2O01k4O/6dgpVKhXq+zsrJCOp1uOo7FeHp/kf3tV6xtbODxeNpzqOs6uVyObDZLoVAgEok08+n1ckNxV9UmFJyWy//+Y/8CB9nahEcWVyUAAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Sprite\",\n    \"title\": \"Sprite\",\n    \"src\": \"/static/df3780f2452252b1cc72cd24cd6fd6c6/070ae/ion-character-left.png\",\n    \"srcSet\": [\"/static/df3780f2452252b1cc72cd24cd6fd6c6/070ae/ion-character-left.png 120w\"],\n    \"sizes\": \"(max-width: 120px) 100vw, 120px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \"))))), mdx(\"p\", null, \"The next issue was what to do when the character moved, because the background needed to be restored. To get around this\\nproblem it saves off the rectangle, using the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Get\"), \" function. So it looks something like:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-basic\"\n  }), \"Put (oldx%, oldy%), spriteBG      ' restore the old background\\nGet (x%, y%)-(x+width, y+height), spriteBG()   ' capture the background\\nPut (x%, y%), andMask, AND    ' mask off the sprite\\nPut (x%, y%), orMask, OR      ' draw opaque sprite\\noldx% = x%\\noldy% = y%\\n\")), mdx(\"p\", null, \"This meant that the sprites would flash a lot and therefore it would only move one sprite at a time to minimize the\\ntime when the background was being shown. This meant that if two sprites collided they could leave some junk on the\\nscreen. You can see it if you rush an enemy.\"), mdx(\"h2\", null, \"Palette issues\"), mdx(\"p\", null, \"A big issue for a long time was setting up the palette. 256 color graphics is indexed, meaning the 8-bit value of the pixel\\nis used as an index into a color palette that defines the level of red, green, and blue. To set the palette you could\\nuse the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"SetPalette\"), \" function.\"), mdx(\"p\", null, \"The trouble with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"SetPalette\"), \" function is that it was \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"em\", {\n    parentName: \"strong\"\n  }, \"increadibly\")), \" slow. This is because it waited for a\\nvertical retrace to set the palette for a single color.\"), mdx(\"p\", null, \"The old cathode ray tube monitors that we had back then worked by firing electrons at a phosphor screen. An electron\\ngun would trace its way across the screen, left to right and top to bottom. When it got to the right side of the\\nscreen it would move down to the next line in a move called the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"horizontal retrace\"), \". When it finished the last line\\nit would return to the top left corner in a move called the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"vertical retrace\"), \".\"), mdx(\"p\", null, \"If you set the palette while the electron gun was firing at the screen it caused a conflict, which resulted in white\\nspecs flashing up on the screen. This phenomenom was creatively referred to as 'snow'. To avoid snow you had to wait\\nfor a horizontal or a vertical retrace. If you waited for a horizontal retrace then you could end up in a situation\\nwhere the top half of the screen has a different color for a fraction of a second, so QuickBasic waited for the\\nvertical refresh. In 256 color mode, that refresh happened every 1/70th of a second, about 14ms.\"), mdx(\"p\", null, \"The problem is that if you have 256 colors to set, that meant it took at least about 3.7 seconds just to setup the colors.\\nIt wasn't until much later that I discovered the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"OUT\"), \" command, which let me set the palette without waiting for a\\nrefresh. That's what the version that you can run in this browser uses.\"), mdx(\"p\", null, \"You can find the color palette register reference \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://www.osdever.net/FreeVGA/vga/colorreg.htm\"\n  }), \"here (external link)\")), mdx(\"h2\", null, \"Level design and operation\"), mdx(\"p\", null, \"Going from room to room, the player's coordinates are preserved. When the player presses the down arrow\\nwhile standing on a door tile, it replaces the background tiles, removes any enemies and loads the new enemies.\"), mdx(\"p\", null, \"The switches work in a horizontal field, replacing any electric zapper tiles with background tiles. Energy potions\\nand powerup balls add to player health and then get replaced by a background tile. Chests only get replaced if\\nthe player has at least one key in their inventory.\"), mdx(\"p\", null, \"Enemy behavior is trivial, they move left or right until they hit a wall or the edge of the screen. If it is a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Bog\"), \"\\n(the porcupine looking creature), it has gravity applied to it. If it finds itself falling, it turns around. The\\nother enemy is called a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Shilbeird\"), \" and isn't subject to gravity.\"), mdx(\"p\", null, \"If the player or a Bog intersect with a solid tile, they get teleported up on top of that tile. This works well\\nenough for most of the platformer feel.\"), mdx(\"p\", null, \"Tiles are 32 pixels by 20 pixels, for a total of 10x10 on screen. The 256 color mode, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"SCREEN 13\"), \", has a resolution\\nof 320x200 pixels.\"), mdx(\"h2\", null, \"Fonts\"), mdx(\"p\", null, \"There is no font support, but QuickBasic did have the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DRAW\"), \" command, which is essentially a turtle. To have a\\nnice variable sized font I painstakingly traced out the commands for each character, such as\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-basic\"\n  }), \"W$ = \\\"bunu3fenu2feu3bd4\\\"\\n\\nx   x\\nx x x\\nx x x\\n x x\\n\")), mdx(\"p\", null, \"Each letter had to return the turtle to the bottom right point. Drawing text consisted of iterating through a\\nstring and calling the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DRAW\"), \" command for each letter. It would advance a pixel between each letter. This whole\\nprocess wasn't very quick, which encouraged brevity.\"), mdx(\"h1\", null, \"Level Editor\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"160px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/18a4831cbfc9aef1b4d7215ea9f23877/0913d/ionlvl_1.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"62.5%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQD/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABmilGzEf/xAAZEAADAAMAAAAAAAAAAAAAAAABAgMAEyD/2gAIAQEAAQUCtZqYzsDtfj//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAcEAAABgMAAAAAAAAAAAAAAAAAAQIRMpEgInH/2gAIAQEABj8CJteGJqsTVeH/xAAbEAABBAMAAAAAAAAAAAAAAAARAAEgITGRof/aAAgBAQABPyGv3DJEPdSclbMP/9oADAMBAAIAAwAAABAvD//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAEDAQE/EFn/xAAWEQEBAQAAAAAAAAAAAAAAAAARARD/2gAIAQIBAT8QaGf/xAAdEAEAAQQDAQAAAAAAAAAAAAABEQAhMWEQQbHw/9oACAEBAAE/EECe2V5LHhNHBiw7t02wnx3Srnn/2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Level Editor Screenshot\",\n    \"title\": \"Level Editor Screenshot\",\n    \"src\": \"/static/18a4831cbfc9aef1b4d7215ea9f23877/0913d/ionlvl_1.jpg\",\n    \"srcSet\": [\"/static/18a4831cbfc9aef1b4d7215ea9f23877/0913d/ionlvl_1.jpg 160w\"],\n    \"sizes\": \"(max-width: 160px) 100vw, 160px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"As a follow up project to the IonCreation game, I made this tool to make levels. The\\nintention was that people could build out some neat levels for their friends to explore.\"), mdx(\"p\", null, \"It was also written using Microsoft QuickBasic 4.5 for MS-DOS. It used the mouse through\\nsome third party library that added mouse support. To make it work I shrunk all the tiles\\nto be 16x10, so the editor could display them.\"), mdx(\"p\", null, \"If you choose the \\\"Opponents\\\" menu item, you can set up to four opponents. Click the mouse on the header to go back to the main editor.\"), mdx(\"p\", null, \"You can play IonCreation directly in your browser \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/ij/index.html\"\n  }), \"here\"), \"! \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"You will need a keyboard to play\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Arrow keys to move\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Spacebar to \\\"shoot\\\"\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"down arrow to use switches and doors\")));\n}\n;\nMDXContent.isMDXComponent = true;","fileAbsolutePath":"C:/Users/alex/Documents/gatsby/g-talistreit-com/src/posts/ioncreation-code.mdx","excerpt":"IonCreation If you'd like to try it out, go  here . This platformer game was written using Microsoft QuickBasic 4.5 for MS-DOS. It features…","frontmatter":{"date":"January 01, 1992","title":"IonCreation","category":"code","short":"A platformer game written using Microsoft QuickBasic 4.5 for MS-DOS. Download and play it using DOSBox!","image":{"childImageSharp":{"fixed":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAEDBQT/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwT/2gAMAwEAAhADEAAAAcWOyhKoUOjBivAD/8QAHRAAAgIBBQAAAAAAAAAAAAAAAAECERMDEiEiM//aAAgBAQABBQLqcWy5LUn6sxRT2xMcT//EABkRAQACAwAAAAAAAAAAAAAAAAEAAhAREv/aAAgBAwEBPwFMVDU5J//EABkRAAMBAQEAAAAAAAAAAAAAAAABAhIDUf/aAAgBAgEBPwGbbEdKejden//EAB0QAAEDBQEAAAAAAAAAAAAAAAABEUECEBIhMVH/2gAIAQEABj8Cm0FKZO4uyD04cP/EABsQAAIDAQEBAAAAAAAAAAAAAAABESExgWFx/9oACAEBAAE/IUpW24K6Zg3nDGyYtDxaXwS84Y8bounb9Z4z/9oADAMBAAIAAwAAABArB0D/xAAaEQEBAAIDAAAAAAAAAAAAAAABABFhMUHw/9oACAEDAQE/EBDO/dzzOLi0l//EABsRAQACAgMAAAAAAAAAAAAAAAEAESFhcZGh/9oACAECAQE/EEK1fvEWIFAtTY7n/8QAHRABAQACAgMBAAAAAAAAAAAAAREAITFRYcHR8P/aAAgBAQABPxAFAdae8MF40hu5aVLR+LkVEEQJ4yp5fO/XnJDVrs95ZWhIvjjqYWkFKge8R+z9z//Z","width":96,"height":96,"src":"/static/c7a84bfda118b7bfd4c6ef1ead6840ac/eee8e/ion_4.jpg","srcSet":"/static/c7a84bfda118b7bfd4c6ef1ead6840ac/eee8e/ion_4.jpg 1x,\n/static/c7a84bfda118b7bfd4c6ef1ead6840ac/9d183/ion_4.jpg 1.5x"}}}},"slug":"ioncreation-code"}},{"node":{"id":"4ad732e5-3d21-5e7b-ade2-1596761749e2","body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"date\": \"1992-01-01\",\n  \"title\": \"IonCreation\",\n  \"category\": \"games\",\n  \"image\": \"../images/ion_4.jpeg\",\n  \"short\": \"A platformer game written using Microsoft QuickBasic 4.5 for MS-DOS. Play it in your browser!\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"IonCreation\"), mdx(\"p\", null, \"Platformer game with 256 color hand drawn pixel graphics.\"), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/ij/index.html\"\n  }), mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"160px\"\n    }\n  }), \"\\n      \", mdx(\"span\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"62.5%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/9oADAMBAAIQAxAAAAHHVppKrI//xAAbEAEAAgIDAAAAAAAAAAAAAAABAhIAEQMTIv/aAAgBAQABBQJj5C0qmdew49JaB//EABYRAQEBAAAAAAAAAAAAAAAAAAASIf/aAAgBAwEBPwGGP//EABoRAAICAwAAAAAAAAAAAAAAAAABAhETMVH/2gAIAQIBAT8Byrpcno//xAAZEAACAwEAAAAAAAAAAAAAAAAAEQEhMQL/2gAIAQEABj8CdCNg3bGxR0f/xAAaEAADAQEBAQAAAAAAAAAAAAAAAREhcUHx/9oACAEBAAE/IYQpJ+MiJD7LNCb6rDFb4Ihn4f/aAAwDAQACAAMAAAAQtD//xAAYEQADAQEAAAAAAAAAAAAAAAAAASERsf/aAAgBAwEBPxBM8eQmPh//xAAaEQEAAgMBAAAAAAAAAAAAAAABACExUXHh/9oACAECAQE/EEhG17haw75P/8QAHRABAAICAgMAAAAAAAAAAAAAAQARITFBUZHB8P/aAAgBAQABPxA8FEVFvrUQLmNC0HvzBCxPrqKe2cpuGbqWGHMpwEsEz//Z')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"IonCreation Screenshot\",\n    \"title\": \"IonCreation Screenshot\",\n    \"src\": \"/static/c7a84bfda118b7bfd4c6ef1ead6840ac/0913d/ion_4.jpg\",\n    \"srcSet\": [\"/static/c7a84bfda118b7bfd4c6ef1ead6840ac/0913d/ion_4.jpg 160w\"],\n    \"sizes\": \"(max-width: 160px) 100vw, 160px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n    \"))), mdx(\"p\", null, mdx(\"center\", null, mdx(\"a\", {\n    className: \"button is-primary\",\n    href: \"/ij/index.html\"\n  }, \"Play Now\"))), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"You will need a keyboard to play\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Arrow keys to move\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Spacebar to \\\"shoot\\\"\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"down arrow to use switches and doors\")), mdx(\"h1\", null, \"Level Editor\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"160px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/18a4831cbfc9aef1b4d7215ea9f23877/0913d/ionlvl_1.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"62.5%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQD/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABmilGzEf/xAAZEAADAAMAAAAAAAAAAAAAAAABAgMAEyD/2gAIAQEAAQUCtZqYzsDtfj//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAcEAAABgMAAAAAAAAAAAAAAAAAAQIRMpEgInH/2gAIAQEABj8CJteGJqsTVeH/xAAbEAABBAMAAAAAAAAAAAAAAAARAAEgITGRof/aAAgBAQABPyGv3DJEPdSclbMP/9oADAMBAAIAAwAAABAvD//EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAEDAQE/EFn/xAAWEQEBAQAAAAAAAAAAAAAAAAARARD/2gAIAQIBAT8QaGf/xAAdEAEAAQQDAQAAAAAAAAAAAAABEQAhMWEQQbHw/9oACAEBAAE/EECe2V5LHhNHBiw7t02wnx3Srnn/2Q==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Level Editor Screenshot\",\n    \"title\": \"Level Editor Screenshot\",\n    \"src\": \"/static/18a4831cbfc9aef1b4d7215ea9f23877/0913d/ionlvl_1.jpg\",\n    \"srcSet\": [\"/static/18a4831cbfc9aef1b4d7215ea9f23877/0913d/ionlvl_1.jpg 160w\"],\n    \"sizes\": \"(max-width: 160px) 100vw, 160px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"To run the level editor:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"select \\\"Exit to DOS\\\" from the main menu\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"type \\\"Y\\\" to confirm\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"type \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"mapedit\"), \" at the command prompt and press enter\")), mdx(\"p\", null, \"To play the modified levels:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"select \\\"Save All\\\" from the drop down menu\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"select \\\"Quit\\\" from the drop down menu\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"type \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"ion\"), \" at the command prompt and press enter\")), mdx(\"p\", null, \"If you're interested in the technical side, read about it \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/code/ioncreation-code\"\n  }), \"here\")));\n}\n;\nMDXContent.isMDXComponent = true;","fileAbsolutePath":"C:/Users/alex/Documents/gatsby/g-talistreit-com/src/posts/ioncreation-game.mdx","excerpt":"IonCreation Platformer game with 256 color hand drawn pixel graphics. You will need a keyboard to play Arrow keys to move Spacebar to \"shoot…","frontmatter":{"date":"January 01, 1992","title":"IonCreation","category":"games","short":"A platformer game written using Microsoft QuickBasic 4.5 for MS-DOS. Play it in your browser!","image":{"childImageSharp":{"fixed":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAEDBQT/xAAWAQEBAQAAAAAAAAAAAAAAAAACAwT/2gAMAwEAAhADEAAAAcWOyhKoUOjBivAD/8QAHRAAAgIBBQAAAAAAAAAAAAAAAAECERMDEiEiM//aAAgBAQABBQLqcWy5LUn6sxRT2xMcT//EABkRAQACAwAAAAAAAAAAAAAAAAEAAhAREv/aAAgBAwEBPwFMVDU5J//EABkRAAMBAQEAAAAAAAAAAAAAAAABAhIDUf/aAAgBAgEBPwGbbEdKejden//EAB0QAAEDBQEAAAAAAAAAAAAAAAABEUECEBIhMVH/2gAIAQEABj8Cm0FKZO4uyD04cP/EABsQAAIDAQEBAAAAAAAAAAAAAAABESExgWFx/9oACAEBAAE/IUpW24K6Zg3nDGyYtDxaXwS84Y8bounb9Z4z/9oADAMBAAIAAwAAABArB0D/xAAaEQEBAAIDAAAAAAAAAAAAAAABABFhMUHw/9oACAEDAQE/EBDO/dzzOLi0l//EABsRAQACAgMAAAAAAAAAAAAAAAEAESFhcZGh/9oACAECAQE/EEK1fvEWIFAtTY7n/8QAHRABAQACAgMBAAAAAAAAAAAAAREAITFRYcHR8P/aAAgBAQABPxAFAdae8MF40hu5aVLR+LkVEEQJ4yp5fO/XnJDVrs95ZWhIvjjqYWkFKge8R+z9z//Z","width":96,"height":96,"src":"/static/c7a84bfda118b7bfd4c6ef1ead6840ac/eee8e/ion_4.jpg","srcSet":"/static/c7a84bfda118b7bfd4c6ef1ead6840ac/eee8e/ion_4.jpg 1x,\n/static/c7a84bfda118b7bfd4c6ef1ead6840ac/9d183/ion_4.jpg 1.5x"}}}},"slug":"ioncreation-game"}}]}},"staticQueryHashes":["1165658775","2329094022","534146544"]}